// 不要犹豫，直接删除, 里面的内容自己实现
// 提供一个默认的配置项
// 我们把token设置到本地存储的目的是什么?

// 当我们的界面刷新的时候，我们会从本地存储里面取到token
// 把获取到的token存到vuex
// 存到vuex之后，后面项目使用token的时候直接从vuex取值即可
import { getToken, removeToken, setTimeStamp, setToken } from '@/utils/auth'
import { getInfo, getUserDetailById, handleLogin } from '@/api/user'
import { resetRouter } from '@/router'

// 获取到token之后
// 1、存储vuex
// 2、存储本地存储

// 1、actions下面的login请求了登录的接口，传入接口所需要的数据(调用dispatch传递过来的)，返回的结果进行打印
// 2、utils/request 添加baseUrl: '/api' （接口定义的）

export default {
  namespaced: true, // 开启命名空间
  state: {
    token: getToken(), // 默认的token值
    userInfo: {} // 存储用户信息的state
  },
  mutations: {
    setToken(state, token) {
      state.token = token
    },
    setUserInfo(state, payload) {
      // 存储用户信息的mutations
      state.userInfo = payload
    },
    removeUserInfo(state) {
      // 清除个人信息
      state.userInfo = {}
    },
    removeToken(state) {
      //  清空用户token
      state.token = null
      //  本地存储
      removeToken()
    }
  },
  actions: {
    // 登录的action
    async login(context, data) {
      const res = await handleLogin(data)
      context.commit('setToken', res)
      setToken(res)
      //   存储一个时间戳
      //  方便后面处理token失效逻辑
      setTimeStamp(Date.now())
    },
    //  获取个人信息的action
    // 获取到的个人信息存储vuex
    async getUserInfo(context) {
      // 目前的接口里面是没有头像数据的
      // 我们个人信息存储在两个接口里面的
      // 如果我们想要拿到所有的个人信息
      // 需要调用两个接口，把返回的结果进行合并
      const res = await getInfo()
      const avatarInfo = await getUserDetailById(res.userId) // 这里的userId是从上一个接口获取到的
      const allUserInfo = {
        ...res,
        ...avatarInfo
      }
      context.commit('setUserInfo', allUserInfo)
      return allUserInfo
    },
    logOut({ commit }) {
      //  清除用户的token
      //  1、本地存储
      //  2、vuex
      //  清除用户的个人信息
      //  只有vuex里面有
      commit('removeToken')
      commit('removeUserInfo')
      // vuex里面routers清空了
      commit('permission/setRoutes', [], { root: true })
      // 清空路由的匹配信息
      resetRouter()
    }
  }
}

// token失效的处理逻辑
// 1、前端主动介入的处理逻辑
//      1、登录接口会返回一个token
//      2、存储token的时候，我们同时也会存储一个时间戳到本地
// 2、后端处理失效逻辑(返回给前台401)
